{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Feature Extraction and Selection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This basic example shows how to use [tsfresh](https://tsfresh.readthedocs.io/) to extract useful features from multiple timeseries and use them to improve classification performance.\n",
    "\n",
    "We use the robot execution failure data set as an example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "from tsfresh import extract_features, extract_relevant_features, select_features\n",
    "from tsfresh.utilities.dataframe_functions import impute\n",
    "from tsfresh.feature_extraction import ComprehensiveFCParameters\n",
    "\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load and visualize data\n",
    "\n",
    "The data set documents 88 robot executions (each has a unique `id` between 1 and 88), which is a subset of the [Robot Execution Failures Data Set](https://archive.ics.uci.edu/ml/datasets/Robot+Execution+Failures). \n",
    "For the purpose of simplicity we are only differentiating between successfull and failed executions (`y`).\n",
    "\n",
    "For each execution 15 force (F) and torque (T) samples are given, which were measured at regular time intervals for the spatial dimensions x, y, and z. \n",
    "Therefore each row of the data frame references a specific execution (`id`), a time index (`index`) and documents the respective measurements of 6 sensors (`F_x`, `F_y`, `F_z`, `T_x`, `T_y`, `T_z`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>time</th>\n",
       "      <th>F_x</th>\n",
       "      <th>F_y</th>\n",
       "      <th>F_z</th>\n",
       "      <th>T_x</th>\n",
       "      <th>T_y</th>\n",
       "      <th>T_z</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>63</td>\n",
       "      <td>-3</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>62</td>\n",
       "      <td>-3</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>61</td>\n",
       "      <td>-3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>63</td>\n",
       "      <td>-2</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>-1</td>\n",
       "      <td>-1</td>\n",
       "      <td>63</td>\n",
       "      <td>-3</td>\n",
       "      <td>-1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  time  F_x  F_y  F_z  T_x  T_y  T_z\n",
       "0   1     0   -1   -1   63   -3   -1    0\n",
       "1   1     1    0    0   62   -3   -1    0\n",
       "2   1     2   -1   -1   61   -3    0    0\n",
       "3   1     3   -1   -1   63   -2   -1    0\n",
       "4   1     4   -1   -1   63   -3   -1    0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from tsfresh.examples import robot_execution_failures\n",
    "\n",
    "robot_execution_failures.download_robot_execution_failures()\n",
    "df, y = robot_execution_failures.load_robot_execution_failures()\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's draw some example executions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cAyRrSDfCGwE0kK3fw7ca6190hjzW+Aq4KEIbk9ERERE+lCkKr1HqrstFjExMSxZsoSjjjqKr371q8ybNy8i249IBdkYUwB8Cvh96LYB5gPPhBZ5HLgwEtsSEREREWm3efNmUlJS2LNnT8TWGakWi18D3wGCodvZQJ211h+6XQKM7uyJxphrjDFrjDFrKisrIzQcERERERnq6uvr+cY3vsG///1vqqureeaZZw7/pG7odUA2xiwEKqy1a3vyfGvtI9baudbaubm5ub0djoiIiIgME9/85jf52te+xpQpU/jDH/7AbbfdRkVFRa/XG4ke5HnABcaYTwKJOD3I/wdkGGNiQ1XkAqA0AtsSERERkSGuqampW8s9+uijHdcLCwvZsmVLRLbf6wqytfa71toCa+044FLgTWvtF4C3gItDi10GPN/bbYmIiIiI9LW+nAf5VuBJY8xPgPeBP/ThtkRERERkiHr11Ve59dZb97tv/PjxPPvss32yvYgGZGvt28DboevbgBMiuX4RERERGX4WLFjAggUL+m17ETtRiIiIiIjIUKCALCIiIiISRgFZRERERCSMArKIiIiISJi+nMVCREREROSIuVwuZs+e3XH7ueeeY9y4cf22fQVkERERERlQkpKSWLduXdS2r4AsIiIiIp17+TYoXx/ZdY6YDZ+4OyKrOv300/nNb37DnDlzADj11FN54IEHOProo3u1XvUgi4iIiMiA0tzczJw5c5gzZw4XXXRRl8tdddVVLFmyBIDi4mJaWlp6HY5BFWQRERER6UqEKr1HqrstFpdccgl33nknv/jFL3j00Ue5/PLLI7J9BWQRERERGZTcbjfnnnsuzz//PE8//TRr166NyHoVkEVERERk0PrKV77CokWLOO2008jMzIzIOtWDLCIiIiKD1nHHHUdaWhpXXHFFxNapgCwiIiIiA0pTU1O3l92zZw/BYJDzzjsvYttXQBYRERGRQemPf/wjJ554Ij/96U+JiYlcrFUPsoiIiIgMaK+++iq33nrrfveNHz+eZ599li9/+csR354CsoiIiIgMaAsWLGDBggX9tj21WIiIiIiIhFFAFhEREREJo4AsIiIiIhJGAVlEREREJIwO0hMRERGRAcXlcjF79uyO28899xzjxo3rt+0rIIuIiIjIgJKUlMS6deuitn0FZBERERHp1M9X/5xNNZsius5pWdO49YRbD79gN3zlK19hzZo1AJSWlvL1r3+dH/3oR71erwKyiIiIiAwozc3NzJkzB9h3QpDO/P73vwdg586dnH/++Vx++eUR2b4CsoiIiIh0KlKV3iN1JC0WLS0tXHLJJdx3332MHTs2ItvXLBYiIiIiMmhde+21fPrTn+acc86J2DoVkEVERERkUHrggQdobGzktttui+h6FZBFREREZFD65S9/yfr165kzZw5z5szht7/9bUTWqx5kERERERlQmpqaurXc9u3b+2T7qiCLiIiIiITpdQXZGJMI/BtICK3vGWvtj4wx44EngWxgLfAla21bb7cnIiIiIsPLq6++yq237j+jxqGmf+utSLRYtALzrbVNxpg44L/GmJeBm4F7rbVPGmN+C1wFPBSB7YmIiIjIMLJgwQIWLFjQb9vrdYuFdbQ3isSFfiwwH3gmdP/jwIW93ZaIiIiISF+LSA+yMcZljFkHVACvA1uBOmutP7RICTA6EtsSEREREelLEQnI1tqAtXYOUACcAEzr7nONMdcYY9YYY9ZUVlZGYjgiIiIiIj0W0VksrLV1wFvAyUCGMaa9x7kAKO3iOY9Ya+daa+fm5uZGcjgiIiIiIkcsErNY5AI+a22dMSYJOBf4OU5QvhhnJovLgOd7uy0RERERGdqqq6s5++yzASgvL8flctFeRF29ejXx8fF9PoZIzGIxEnjcGOPCqUg/ba190RjzMfCkMeYnwPvAHyKwLREREREZwrKzs1m3bh0At99+OykpKdxyyy39OoZeB2Rr7YfAMZ3cvw2nH1lEREREBqHyu+6ideOmiK4zYfo0RnzvexFZ17vvvstVV13F6tWrCQQCnHDCCTz11FPMmjWrV+vVqaZFREREZFA6/vjjueCCC/jBD35Ac3MzX/ziF3sdjkEBWURERES6EKlKb1/64Q9/yPHHH09iYiK/+c1vIrLOiM5iISIiIiLSn6qrq2lqaqKxsZGWlpaIrFMBWUREREQGra9+9avceeedfOELX+DWW2+NyDrVYiEiIiIig9If//hH4uLi+PznP08gEOCUU07hzTffZP78+b1ar7HWRmiIvTd37ly7Zs2aaA9DREREZNjauHEj06dPj/YwIqqz38kYs9ZaO7ez5dViISIiIiISRi0WIiIiIjKghZ9dL9yyZcvIzs6O+PYUkEVERERkQAs/u15/UIuFiIiIiEgYBWQRERERkTAKyCIiIiIiYRSQRURERETC6CA9ERERERkwwmesKC8vx+VykZubC8Dq1auJj4/v8zEoIIuIiIjIgBE+Y8Xtt99OSkoKt9xyS7+OQQFZRERERDr1n6eLqdrdFNF15hSmcNpnp0RkXT/84Q/JysripptuAuD73/8+eXl53Hjjjb1ar3qQRURERGRQuvLKK/njH/8IQDAY5Mknn+SLX/xir9erCrKIiIiIdCpSld6+Mm7cOLKzs3n//ffZu3cvxxxzTETOrKeALCIiIiKD1le+8hWWLFlCeXk5V155ZUTWqRYLERERERm0LrroIl555RXeffddFixYEJF1qoIsIiIiIoNWfHw8Z511FhkZGbhcroisUwFZRERERAak22+//bDLBINBVq5cyd/+9reIbVctFiIiIiIyKH388cdMmjSJs88+m8mTJ0dsvaogi4iIiMiAFn52vXDLli1j27ZtEd+eArKIiIiIDGjhZ9frD2qxEBEREREJo4AsIiIiIhJGAVlEREREJIx6kEVERERkwAg/IK+8vByXy0Vubi4Aq1evJj4+vs/HoIAsIiIiIgNG+AF5t99+OykpKdxyyy39Oga1WIiIiIjIoPTb3/6WOXPmMGfOHMaPH89ZZ50VkfX2uoJsjCkE/gjkAxZ4xFr7f8aYLOApYBywA/istba2t9sTERERkf7x1pJHqNgZ2XmG88ZO4KzLr4nIuq699lquvfZafD4f8+fP5+abb47IeiNRQfYD37LWzgBOAr5mjJkB3AYss9ZOBpaFbouIiIiIRNSNN97I/PnzWbRoUUTW1+sKsrW2DCgLXW80xmwERgOLgTNDiz0OvA3c2tvtiYiIiEj/iFSlty8tWbKEnTt3cv/990dsnRE9SM8YMw44BlgF5IfCM0A5TgtGZ8+5BrgGYMyYMZEcjoiIiIgMYWvXruWXv/wl//nPf4iJidyhdRFbkzEmBfg7cJO1tiH8MWutxelPPoi19hFr7Vxr7dz2KTxERERERA7n/vvvp6amhrPOOos5c+bwla98JSLrjUgF2RgThxOO/2Kt/Ufo7r3GmJHW2jJjzEigIhLbEhEREZHh4fbbbz/k44899lifbLfXFWRjjAH+AGy01t4T9tALwGWh65cBz/d2WyIiIiIifS0SFeR5wJeA9caYdaH7vgfcDTxtjLkK2Al8NgLbEhEREZFhJvzseuGWLVtGdnZ2xLcXiVks/guYLh4++DcRERERETkC4WfX6w86k56IiIiI7MeZX2Fo6MnvooAsIiIiIh0SExOprq4eEiHZWkt1dTWJiYlH9LyIzoMsIiIiIoNbQUEBJSUlVFZWRnsoEZGYmEhBQcERPUcBWUREREQ6xMXFMX78+GgPI6rUYiEiIiIiEkYBWUREREQkjAKyiIiIiEgYBWQRERERkTAKyCIiIiIiYRSQRURERETCKCCLiIiIiIRRQBYRERERCaOALCIiIiISRgFZRERERCSMArKIiIiISBgFZBERERGRMArIIiIiIiJhFJBFRERERMIoIIuIiIiIhFFAFhEREREJo4AsIiIiIhJGAVlEREREJIwCsoiIiIhIGAVkEREREZEwCsgiIiIiImEUkEVEREREwiggi4iIiIiEUUAWEREREQmjgCwiIiIiEkYBWUREREQkTEQCsjHmUWNMhTHmo7D7sowxrxtjNocuMyOxLRERERGRvhSpCvIS4PwD7rsNWGatnQwsC90WERERERnQIhKQrbX/BmoOuHsx8Hjo+uPAhZHYloiIiIhIX+rLHuR8a21Z6Ho5kN+H2xIRERERiYh+OUjPWmsB29ljxphrjDFrjDFrKisr+2M4IiIiIiJd6suAvNcYMxIgdFnR2ULW2kestXOttXNzc3P7cDgiIiIiIofXlwH5BeCy0PXLgOf7cFsiIiIiIhERqWne/gq8A0w1xpQYY64C7gbONcZsBs4J3RYRERERGdBiI7ESa+3nunjo7EisX0RERESkv+hMeiIiIiIiYRSQRURERETCKCCLiIiIiIRRQBYRERERCaOALCIiIiISRgFZRERERCSMArKIiIiISBgFZBERERGRMArIIiIiIiJhFJBFRERERMIoIIuIiIiIhFFAFhEREREJo4AsIiIiIhJGAVlEREREJIwCsoiIiIhIGAVkEREREZEwCsgiIiIiImEUkEVEREREwiggi4iIiIiEUUAWEREREQmjgCwiIiIiEkYBWURkEGsrKaWtpCTawxARGVIUkEVEBqnGN95g2wUXsO0Tn6Ty/gcItrVFe0giIkOCArKIyCBjraXywQcp+foNJEyaROq551J1//1sv+jTeN97L9rDExEZ9BSQRUQGkaDXS+lN36TqN/eRvvgCxv7pj4y+51cUPvIwwWYv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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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q7nqqqs4+OCDue2227j22mvZsmXLkLerMc4DmDitmFRJkvrVTRz+2pp8lyMiIiJyQGtraxvUeosXL+6dnzlzJqtXr87J/tXjPAAzo3peOXWrm/NdioiIiIjkmXqc96JmfgWv/H0rO5q7mFBemO9yRERERCT20EMPcc011+zSNnfuXO69995h2Z+C815U11YAULeqifkLp+a3GBERERHptWjRIhYtWjRi+9NQjb2omllCotCnflVTvksRERERkTxScN4Lz/eoPqhM45xFREREDnAKzoNQXVtBY10bXe3pfJciIiIiInmi4DwINbUV4KD+JfU6i4iIiByoFJwHYercMjzfqNeFUERERETyxvd9FixY0Htbs2bNiO5fZ9UYhESBz5TZpdStUo+ziIiISL4UFRXx9NNP523/Cs6DVF1bwd8fXk+mOyBR4Oe7HBEREZH8efBa2LQyt9ucdhScfn1ONvX617+eb33rWyxYsACAk08+mZtuuolXvepVQ9quhmoMUs38CsLAsfmVlnyXIiIiInJA6ujo6B2mce655/a73uWXX87tt98OwIsvvkhnZ+eQQzOox3nQqueVg0Hd6iamHzIx3+WIiIiI5E+Oeob31WCHarzzne/kC1/4Al/72tdYvHgxl1xySU72r+A8SIXFSSprSnSAoIiIiMgoV1xczFve8hbuu+8+7r77blasWJGT7So474Oa2nJeeHwTYRDi+RrlIiIiIjJaXXHFFZx55pm87nWvY+LE3IwWUPrbB9XzK0h3BWzd0JbvUkRERERkAMceeyxlZWVceumlOdumgvM+qKmtAKBuVVNe6xARERE5ELW1Db7zsq6ujjAMeetb35qz/Ss474MJFYWUVRUpOIuIiIiMYnfeeScnnHACX/ziF/G83MVdjXHeRzW15axZ2YhzDjPLdzkiIiIiB6yHHnqIa665Zpe2uXPncu+993LRRRflfH8KzvuouraCFx7bxPZN7UyqnpDvckREREQOWIsWLWLRokUjtj8N1dhHPeOcdVo6ERERkQOLgvM+Kp9SRFFZAXUKziIiIiIHFAXnfWRm1NSW6wBBERERkQOMgvN+qJlfQdu2Llq3dea7FBEREREZIQrO+6Fa53MWERERGXG+77NgwYLe25o1a0Z0/zqrxn6onF5CQcqnfnUTh5wwLd/liIiIiBwQioqKePrpp/O2fwXn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Xosco/p5bUclXTlQRERERGQQ1OMsIiIiIjIICs4iIiIiIoOg4CwiIiIiMggKziIiIiIig6DgLCIiIiIyCArOIiJjiJlVmNmH4/kaM1uS75pERA4UOh2diMgYYmZzgF86547Mdy0iIgeaRL4LEBGRfXI9MM/MngZWAYc5546ML/t7DjABmA98HSgguuBQF/A259w2M5sH3ARUAe3AB5xzL4z0kxARGYs0VENEZGy5FnjJObcA+H+7LTsSOA84Dvgi0O6cO4boilwXxevcAvyrc+5Y4JPA/41E0SIi44F6nEVExo9HnHOtQKuZNQO/iNtXAkebWQnwGuAeM+t5TOHIlykiMjYpOIuIjB9dWfNh1v2Q6PPeA5ri3moREdlHGqohIjK2tAKl+/NA51wL8IqZvRPAIq/KZXEiIuOZgrOIyBjinGsE/mJm/wC+th+beB9wuZn9HXgWODuX9YmIjGc6HZ2IiIiIyCCox1lEREREZBAUnEVEREREBkHBWURERERkEBScRUREREQGQcFZRERERGQQFJxFRERERAZBwVlEREREZBAUnEVEREREBuH/A7IpKz8QKIWhAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[df.id == 3][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x='time', title='Success example (id 3)', figsize=(12, 6));\n",
    "df[df.id == 20][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x='time', title='Failure example (id 20)', figsize=(12, 6));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extract Features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the data to extract time series features using `tsfresh`.\n",
    "We want to extract features for each time series, that means for each robot execution (which is our `id`) and for each of the measured sensor values (`F_*` and `T_*`).\n",
    "\n",
    "You can think of it like this: tsfresh will result in a single row for each `id` and will calculate the features for each columns (we call them \"kind\") separately.\n",
    "\n",
    "The `time` column is our sorting column.\n",
    "For an overview on the data formats of `tsfresh`, please have a look at [the documentation](https://tsfresh.readthedocs.io/en/latest/text/data_formats.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Feature Extraction:   0%|          | 0/106 [00:00<?, ?it/s]\n"
     ]
    },
    {
     "ename": "NotImplementedError",
     "evalue": "AR has been removed from statsmodels and replaced with statsmodels.tsa.ar_model.AutoReg.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mRemoteTraceback\u001b[0m                           Traceback (most recent call last)",
      "\u001b[0;31mRemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n  File \"/usr/lib/python3.8/multiprocessing/pool.py\", line 125, in worker\n    result = (True, func(*args, **kwds))\n  File \"/usr/local/lib/python3.8/dist-packages/tsfresh/utilities/distribution.py\", line 43, in _function_with_partly_reduce\n    results = list(itertools.chain.from_iterable(results))\n  File \"/usr/local/lib/python3.8/dist-packages/tsfresh/utilities/distribution.py\", line 42, in <genexpr>\n    results = (map_function(chunk, **kwargs) for chunk in chunk_list)\n  File \"/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\", line 337, in _do_extraction_on_chunk\n    return list(_f())\n  File \"/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\", line 317, in _f\n    result = func(x, param=parameter_list)\n  File \"/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/feature_calculators.py\", line 1405, in ar_coefficient\n    calculated_AR = AR(x_as_list)\n  File \"/usr/local/lib/python3.8/dist-packages/statsmodels/tsa/ar_model.py\", line 822, in __init__\n    raise NotImplementedError(\nNotImplementedError: AR has been removed from statsmodels and replaced with statsmodels.tsa.ar_model.AutoReg.\n\"\"\"",
      "\nThe above exception was the direct cause of the following exception:\n",
      "\u001b[0;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_14770/2672644127.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     14\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtsfresh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutilities\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataframe_functions\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mimpute\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     15\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtsfresh\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mextract_features\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mextracted_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mextract_features\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumn_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"id\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumn_sort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"time\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     17\u001b[0m \u001b[0;31m# impute(extracted_features)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     18\u001b[0m \u001b[0;31m# features_filtered = select_features(extracted_features, y)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\u001b[0m in \u001b[0;36mextract_features\u001b[0;34m(timeseries_container, default_fc_parameters, kind_to_fc_parameters, column_id, column_sort, column_kind, column_value, chunksize, n_jobs, show_warnings, disable_progressbar, impute_function, profile, profiling_filename, profiling_sorting, distributor, pivot)\u001b[0m\n\u001b[1;32m    150\u001b[0m             \u001b[0mwarnings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msimplefilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"default\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    151\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 152\u001b[0;31m         result = _do_extraction(df=timeseries_container,\n\u001b[0m\u001b[1;32m    153\u001b[0m                                 \u001b[0mcolumn_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumn_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumn_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumn_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    154\u001b[0m                                 \u001b[0mcolumn_kind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumn_kind\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\u001b[0m in \u001b[0;36m_do_extraction\u001b[0;34m(df, column_id, column_value, column_kind, column_sort, default_fc_parameters, kind_to_fc_parameters, n_jobs, chunk_size, disable_progressbar, show_warnings, distributor, pivot)\u001b[0m\n\u001b[1;32m    253\u001b[0m                   show_warnings=show_warnings)\n\u001b[1;32m    254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 255\u001b[0;31m     result = distributor.map_reduce(_do_extraction_on_chunk, data=data,\n\u001b[0m\u001b[1;32m    256\u001b[0m                                     \u001b[0mchunk_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunk_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    257\u001b[0m                                     function_kwargs=kwargs)\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/utilities/distribution.py\u001b[0m in \u001b[0;36mmap_reduce\u001b[0;34m(self, map_function, data, function_kwargs, chunk_size, data_length)\u001b[0m\n\u001b[1;32m    211\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdistribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_function_with_partly_reduce\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunk_generator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmap_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 213\u001b[0;31m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_iterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    214\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    215\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tqdm/std.py\u001b[0m in \u001b[0;36m__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1178\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1179\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1180\u001b[0;31m             \u001b[0;32mfor\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1181\u001b[0m                 \u001b[0;32myield\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1182\u001b[0m                 \u001b[0;31m# Update and possibly print the progressbar.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.8/multiprocessing/pool.py\u001b[0m in \u001b[0;36mnext\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    866\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0msuccess\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    867\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 868\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    869\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    870\u001b[0m     \u001b[0m__next__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m                    \u001b[0;31m# XXX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.8/multiprocessing/pool.py\u001b[0m in \u001b[0;36mworker\u001b[0;34m()\u001b[0m\n\u001b[1;32m    123\u001b[0m         \u001b[0mjob\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtask\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    124\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 125\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    126\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    127\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mwrap_exception\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0m_helper_reraises_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/utilities/distribution.py\u001b[0m in \u001b[0;36m_function_with_partly_reduce\u001b[0;34m()\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     42\u001b[0m     \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmap_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchunk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mchunk_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 43\u001b[0;31m     \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_iterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     44\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/utilities/distribution.py\u001b[0m in \u001b[0;36m<genexpr>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     40\u001b[0m     \"\"\"\n\u001b[1;32m     41\u001b[0m     \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m     \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmap_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchunk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mchunk_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m     \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_iterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\u001b[0m in \u001b[0;36m_do_extraction_on_chunk\u001b[0;34m()\u001b[0m\n\u001b[1;32m    335\u001b[0m             \u001b[0mwarnings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msimplefilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"default\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    336\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 337\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_f\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/extraction.py\u001b[0m in \u001b[0;36m_f\u001b[0;34m()\u001b[0m\n\u001b[1;32m    315\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    316\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfctype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"combiner\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 317\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparameter_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    318\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    319\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mparameter_list\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/tsfresh/feature_extraction/feature_calculators.py\u001b[0m in \u001b[0;36mar_coefficient\u001b[0;34m()\u001b[0m\n\u001b[1;32m   1403\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mk\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcalculated_ar_params\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1404\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1405\u001b[0;31m                 \u001b[0mcalculated_AR\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mAR\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_as_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1406\u001b[0m                 \u001b[0mcalculated_ar_params\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcalculated_AR\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaxlag\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msolver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"mle\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1407\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mLinAlgError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.8/dist-packages/statsmodels/tsa/ar_model.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m()\u001b[0m\n\u001b[1;32m    820\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    821\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 822\u001b[0;31m         raise NotImplementedError(\n\u001b[0m\u001b[1;32m    823\u001b[0m             \u001b[0;34m\"AR has been removed from statsmodels and replaced with \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    824\u001b[0m             \u001b[0;34m\"statsmodels.tsa.ar_model.AutoReg.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNotImplementedError\u001b[0m: AR has been removed from statsmodels and replaced with statsmodels.tsa.ar_model.AutoReg."
     ]
    }
   ],
   "source": [
    "# We are very explicit here and specify the `default_fc_parameters`. If you remove this argument,\n",
    "# the ComprehensiveFCParameters (= all feature calculators) will also be used as default.\n",
    "# Have a look into the documentation (https://tsfresh.readthedocs.io/en/latest/text/feature_extraction_settings.html)\n",
    "# or one of the other notebooks to learn more about this.\n",
    "# extraction_settings = ComprehensiveFCParameters()\n",
    "# X = extract_features(df, column_id='id', column_sort='time')\n",
    "# X = extract_features(df, column_id='id', column_sort='time',\n",
    "#                      default_fc_parameters=extraction_settings,\n",
    "                     # we impute = remove all NaN features automatically\n",
    "#                      impute_function=impute)\n",
    "#                     )\n",
    "\n",
    "from tsfresh import select_features\n",
    "from tsfresh.utilities.dataframe_functions import impute\n",
    "from tsfresh import extract_features\n",
    "extracted_features = extract_features(df, column_id=\"id\", column_sort=\"time\")\n",
    "# impute(extracted_features)\n",
    "# features_filtered = select_features(extracted_features, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`X` now contains for each robot execution (= `id`) a single row, with all the features `tsfresh` calculated based on the measured times series values for this `id`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "Currently, 4674 non-NaN features are calculated. \n",
    "This number varies with the version of `tsfresh` and with your data.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Select Features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the hypothesis tests implemented in `tsfresh` (see [here](https://tsfresh.readthedocs.io/en/latest/text/feature_filtering.html) for more information) it is now possible to select only the relevant features out of this large dataset.\n",
    "\n",
    "`tsfresh` will do a hypothesis test for each of the features to check, if it is relevant for your given target."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_filtered = select_features(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "X_filtered.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "Currently, 669 non-NaN features survive the feature selection given this target.\n",
    "Again, this number will vary depending on your data, your target and the `tsfresh` version.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train and evaluate classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's train a boosted decision tree on the filtered as well as the full set of extracted features."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_full_train, X_full_test, y_train, y_test = train_test_split(X, y, test_size=.4)\n",
    "X_filtered_train, X_filtered_test = X_full_train[X_filtered.columns], X_full_test[X_filtered.columns]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "classifier_full = DecisionTreeClassifier()\n",
    "classifier_full.fit(X_full_train, y_train)\n",
    "print(classification_report(y_test, classifier_full.predict(X_full_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "classifier_filtered = DecisionTreeClassifier()\n",
    "classifier_filtered.fit(X_filtered_train, y_train)\n",
    "print(classification_report(y_test, classifier_filtered.predict(X_filtered_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compared to using all features (`classifier_full`), using only the relevant features (`classifier_filtered`) achieves better classification performance with less data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "Please remember that the hypothesis test in `tsfresh` is a statistical test.\n",
    "You might get better performance with other feature selection methods (e.g. training a classifier with\n",
    "all but one feature to find its importance) - but in general the feature selection implemented\n",
    "in `tsfresh` will give you a very reasonable set of selected features.\n",
    "    \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extraction and Filtering is the same as filtered Extraction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above, we performed the feature extraction and selection independently. \n",
    "If you are only interested in the list of selected features, you can run this in one step:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_filtered_2 = extract_relevant_features(df, y, column_id='id', column_sort='time',\n",
    "                                         default_fc_parameters=extraction_settings)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(X_filtered.columns == X_filtered_2.columns).all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
